Jon McClintlock and Robert Lipe fix bogus free in Linux/Mac USB garmin teardown.
authorrobertl <robertl>
Wed, 14 Mar 2007 17:34:11 +0000 (17:34 +0000)
committerrobertl <robertl>
Wed, 14 Mar 2007 17:34:11 +0000 (17:34 +0000)
jeeps/gpslibusb.c

index 42dd63e86421bad1901cfbad1b4df74e97a56219..efc84db73053ac59b0c56708f369e5e9a5d525dc 100644 (file)
@@ -104,12 +104,25 @@ gusb_teardown(gpsdevh *dh)
        if (udev) {
                usb_release_interface(udev, 0);
                usb_close(udev);
-               xfree(dh);
+               /* In the worst case, we leak a little bit of memory
+                * when called via the atexit handler.  That's not too 
+                * terrible.
+                */
+               if (NULL != dh) {
+                       xfree(dh);
+               }
                udev = NULL;
        }
        return 0; 
 }
 
+static void
+gusb_atexit_teardown(void)
+{
+       gusb_teardown(NULL);
+}
+
+
 /*
  * This is a function of great joy to discover.
  *
@@ -200,7 +213,7 @@ garmin_usb_start(struct usb_device *dev)
        if (udev) return;
 
        udev = usb_open(dev);
-       atexit((void(*)())gusb_teardown);
+       atexit(gusb_atexit_teardown);
 
        if (!udev) { fatal("usb_open failed: %s\n", usb_strerror()); }
        /*